type idType = number | string

/**
 * （一个）角色拥有的一组权限
 */
export interface IRole {
  roleId: idType, // 角色编号
  roleName: string, // 角色名称
  rolePower: { // 角色拥有的权限集合
    moduleIds: Array<idType>, // 可以使用哪些模块
    buttonIds: {
      [moduleId: idType]: Array<idType> // 模块里面可以使用的操作按钮
    },
    gridIds: {
      [moduleId: idType]: Array<idType> // 模块里可以使用的列（字段）
    },
    findIds: {
      [moduleId: idType]: Array<idType> // 模块里可以使用的查询条件（字段）
    },
    gridIdsNot: {
      [moduleId: idType]: Array<idType> // 列表里面不可以用的列
    },
    findIdsNot: {
      [moduleId: idType]: Array<idType> // 列表里面不可以使用的查询字段
    },
    resources: {
      [moduleId: idType]: Array<idType> // 模块的资源权限
    },
    APIs: {
      [moduleId: idType]: Array<idType> // 模块的特殊的后端API
    }
  }
}

/**
 * 角色和用户的关联，基于关系型数据库
 */
export interface IRoleUser {
  roleUserId: idType,
  roleId: idType,
  userId: idType,
}

/**
 * 一个用户可以用多个角色
 */
export interface IUserRole {
  userId: idType,
  roleIds: Array<idType>
}

// 备选项部分

/**
 * 记录 功能模块 信息，用于绑定 el-tree
 */
export interface IRoleModule {
  id: idType, // 模块ID
  label: string,
  children?: IRoleModule[]
}

/**
 * 记录 操作按钮 信息
 */
export interface IRoleButton {
  buttonId: idType, // value
  moduleId: idType,
  label: string, // label
  kind: string | 'add' | 'update' | 'delete' | 'look' | 'detail' | 'list', // 按钮类型，增删改查
}

/**
 * 记录 模块的列表、查询字段、资源权限、后端API。
 * * 一个模块只有一个列表。
 * * 一个模块只有一组查询字段。
 * * 模块可以选择的资源权限
 * * 模块可以选择的后端API
 */
export interface IRoleColumn {
  value: idType, // 字段ID
  label: string, // 字段名称/API 名称/资源权限名称
}

/**
 * 维护角色的准备数据
 */
export interface IRoleData {
  modules: IRoleModule[], // 模块信息，绑定 tree
  buttons: { // 模块里面的操作按钮，绑定 模块里的按钮
    [moduleId: idType]: Array<IRoleButton>
  },
  grids: { // 模块里面的列
    [moduleId: idType]: Array<IRoleColumn> 
  },
  finds: { // 模块里面的查询条件
    [moduleId: idType]: Array<IRoleColumn>
  },
  resources: { // 模块里面可以选择的资源权限
    [moduleId: idType]: Array<IRoleColumn>
  },
  APIs: { // 模块里面可以选择的（其他）后端API
    [moduleId: idType]: Array<IRoleColumn>
  },
  haveCols: { // 模块是否有列、资源权限等选项
    [moduleId: idType]: boolean
  },
  roleInfo: IRole // 记录角色的信息
}

/**
 * 当前角色的信息，维护用的临时数据
 */
export interface IRoleCurrent {
  currentNodeKey: string | number, // 当前选择的节点
  isCheck: boolean,  // 当前节点是否打对号
  checkKeys: Set<string | number> // 已经选择的 key 的集合 
}